package dbmanager

import (
	"reflect"
)

var (
	dbmgr *TypeMgr
)

// NewTableFunc 定义了一个函数类型，用于创建新的数据库表实例
type NewTableFunc func() IDataBaseModel

// GetDBSingleton 获取数据库管理器的单例实例
func GetDBSingleton() *TypeMgr {
	if dbmgr == nil {
		dbmgr = new(TypeMgr)
		dbmgr.tableList = make(map[string]NewTableFunc)
	}
	return dbmgr
}

// TypeMgr 管理数据库表的类型和实例
type TypeMgr struct {
	tableList map[string]NewTableFunc // 所有表类型的映射
	//其他表
	otherTableList map[string]ITable
}

// RegisterType 注册一个新的表类型
func (mgr *TypeMgr) RegisterType(f NewTableFunc) {
	md := f()
	mgr.tableList[md.TableName()] = f
}

// 注册其他表
func (mgr *TypeMgr) RegisterOtherTable(md ITable) {
	mgr.otherTableList[md.TableName()] = md
}

// GetTableList 获取所有注册的表类型
func (mgr *TypeMgr) GetTableList() map[string]NewTableFunc {
	return mgr.tableList
}

// 其他所有表
func (mgr *TypeMgr) GetOtherTableList() map[string]ITable {
	return mgr.otherTableList
}

// GetTableNames 获取所有注册的表名
func (mgr *TypeMgr) GetTableNames() []string {
	result := make([]string, 0, len(mgr.tableList))
	for key := range mgr.tableList {
		result = append(result, key)
	}
	return result
}

// GetTypeByTname 根据表名获取对应的表实例
func (mgr *TypeMgr) GetTypeByTname(tname string) IDataBaseModel {
	return mgr.tableList[tname]()
}

// GetValueByTname 根据表名获取对应的表实例的反射值
func (mgr TypeMgr) GetValueByTname(tname string) reflect.Value {
	return reflect.ValueOf(mgr.tableList[tname]())
}

// GetModelByKeyName 根据键名获取对应的表实例
func (mgr *TypeMgr) GetModelByKeyName(keyname string) IDataBaseModel {
	tname, uid := GetKeyNameResolve(keyname)
	result := mgr.GetTypeByTname(tname)
	if v, ok := result.(IPlayerSubBase); ok {
		v.SetID(uid)
	}
	return result
}
